Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [VB 2008] Riconnettersi ad un server
Forum - C# / VB.NET - [VB 2008] Riconnettersi ad un server

Avatar
mestesso (Normal User)
Newbie


Messaggi: 20
Iscritto: 29/08/2008

Segnala al moderatore
Postato alle 10:35
Giovedì, 25/09/2008
Salve VBnettiani!
Mi aiutate a risolvere questo problema?

Ho un server che rimane in ascolto per accettare dati in arrivo in questo modo
Codice sorgente - presumibilmente C# / VB.NET

  1. tcpListen As New TcpListener(ip, porta)
  2. tcpListen.Start()
  3. tcpClient = tcpListen.AcceptTcpClient()
  4. netStream = tcpClient.GetStream()



E quando il client si disconnette al server uso questo codice
Codice sorgente - presumibilmente Plain Text

  1. tcpClient.Client.Disconnect(True)
  2. tcpClient.Close()
  3. netStream.Close()
  4. tcpListen.Stop()



Dopodichè rinizializzo il codice precedente per rimettere dinuovo il server in ascolto per accettare un altra connessione

Codice sorgente - presumibilmente C# / VB.NET

  1. tcpListen As New TcpListener(ip, porta)
  2. tcpListen.Start()
  3. tcpClient = tcpListen.AcceptTcpClient()
  4. netStream = tcpClient.GetStream()



A questo punto il server va in palla e si blocca.

Qualcuno sa dirmi dove sbaglio?
Io ho pensato che forse quando il client si riconnette al server trova la porta occupata e quindi si blocca.

Suggerimenti?

P.S.
Il codice è in VB.NET, non in php come dice il forum :-)

Ultima modifica effettuata da mestesso il 25/09/2008 alle 10:37
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 11:18
Giovedì, 25/09/2008
Io proverei ad invertire l'ordine:

Codice sorgente - presumibilmente Plain Text

  1. netStream.Close()
  2. tcpClient.Client.Disconnect(True)
  3. tcpClient.Close()
  4. tcpListen.Stop()



Il mio blog: https://piero.dev
PM Quote
Avatar
mestesso (Normal User)
Newbie


Messaggi: 20
Iscritto: 29/08/2008

Segnala al moderatore
Postato alle 15:58
Giovedì, 25/09/2008
Testo quotato

Postato originariamente da pierotofy:

Io proverei ad invertire l'ordine:

Codice sorgente - presumibilmente Plain Text

  1. netStream.Close()
  2. tcpClient.Client.Disconnect(True)
  3. tcpClient.Close()
  4. tcpListen.Stop()




No purtroppo non va. In questo modo invece di bloccarsi mi restituisce errore.

Ultima modifica effettuata da mestesso il 25/09/2008 alle 15:58
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 16:46
Giovedì, 25/09/2008
In teoria dovresti usare lo stesso listener e non inizializzarne uno nuovo. Inoltre, non capisco perchè la prima volta non ti si blocchi: la funzione AccectTcpClient dovrebbe funzionare solo se c'è una connessione in attesa e bloccarti se non ce ne sono.

PM Quote
Avatar
mestesso (Normal User)
Newbie


Messaggi: 20
Iscritto: 29/08/2008

Segnala al moderatore
Postato alle 1:15
Venerdì, 26/09/2008
Testo quotato

Postato originariamente da Il Totem:

In teoria dovresti usare lo stesso listener e non inizializzarne uno nuovo. Inoltre, non capisco perchè la prima volta non ti si blocchi: la funzione AccectTcpClient dovrebbe funzionare solo se c'è una connessione in attesa e bloccarti se non ce ne sono.



Se uso lo stesso listener alla seconda connessione mi sembra che la porta risulta occupata.
In effetti mi si blocca anche la prima volta, però fila tutto liscio, è alla seconda connessione che oltre a bloccarsi non si sblocca più.
Ora sto cercando qualche source in VB.NET in giro per la rete per capire il meccanismo dei server.
Se qualcuno sa gia dove posso trovarne uno è ben accetto se me lo linka :-)

Ultima modifica effettuata da mestesso il 26/09/2008 alle 1:17
PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 15:30
Venerdì, 26/09/2008
Ma se tieni lo stesso listener non può dare porta occupata. Basta che lo fermi (Stop) quando non ti serve e lo riattivi (Start) quando ne hai bisogno.
Non puoi - o meglio, non dovresti - richiamare AcceptTcpClient subito dopo Start(), perchè l'ascolto è un'operazione asicrona: dovresti invece usare un timer che controlla ogni volta SE ci sono connessioni (cosa che tu dai per scontato) e in quel caso, inizializzi il client.

PM Quote
Avatar
mestesso (Normal User)
Newbie


Messaggi: 20
Iscritto: 29/08/2008

Segnala al moderatore
Postato alle 0:28
Sabato, 27/09/2008
Si utilizzo un timer ma forse non lo utilizzo nella maniera giusta.
Vediamo se riuscirò a mettere a posto.

PM Quote
Avatar
mestesso (Normal User)
Newbie


Messaggi: 20
Iscritto: 29/08/2008

Segnala al moderatore
Postato alle 12:06
Sabato, 27/09/2008
Mizzega ho risolto ahhh!
Mi ero dimenticato di inserire nel timer questo:
Codice sorgente - presumibilmente C# / VB.NET

  1. if tcpListen.Pending() then
  2. eccetera eccetera


adesso funziona tutto senza problemi.
Grazie per avermi dato l'illuminazione!

PM Quote
Avatar
Il Totem (Admin)
Guru^2


Messaggi: 3635
Iscritto: 24/01/2006

Segnala al moderatore
Postato alle 14:54
Sabato, 27/09/2008
OK... :k:

PM Quote